package com.foxsteps.gsonformat.tools;

import com.foxsteps.gsonformat.tools.AbstarctJsonParser;
import com.foxsteps.gsonformat.tools.json.JSONArray;
import com.foxsteps.gsonformat.tools.json.JSONObject;

public class DefaultJsonParser extends AbstarctJsonParser {

    @Override
    public JSONObject parseJSONObject(String jsonStr) throws Exception {
        JSONObject json = null;
        try {
            //转换为JSONObject
            json = doParseJSONObject(jsonStr);
        } catch (Exception e) {
            String jsonTS = removeComment(jsonStr);
            jsonTS = jsonTS.replaceAll("^.*?\\{", "{");
            try {
                json = doParseJSONObject(jsonTS);
            } catch (Exception ex) {
                throw ex;
            }
        }
        return json;
    }
    private JSONObject doParseJSONObject(String jsonStr){
        if (jsonStr.startsWith("{")) {
            return new JSONObject(jsonStr);
        } else if (jsonStr.startsWith("[")) {
            JSONArray jsonArray = new JSONArray(jsonStr);
            if (jsonArray.length() > 0 && jsonArray.get(0) instanceof JSONObject) {
                return getJsonObject(jsonArray);
            }
        }
        return null;
    }



    private JSONObject getJsonObject(JSONArray jsonArray) {
        JSONObject resultJSON = jsonArray.getJSONObject(0);

        for (int i = 1; i < jsonArray.length(); i++) {
            Object value = jsonArray.get(i);
            if (!(value instanceof JSONObject)) {
                break;
            }
            JSONObject json = (JSONObject) value;
            for (String key : json.keySet()) {
                if (!resultJSON.keySet().contains(key)) {
                    resultJSON.put(key, json.get(key));
                }
            }
        }
        return resultJSON;
    }
}
